package com.zjj.algorithm.learning.atguigu.algorithm;

/**
 * 1、当只有 1 个盘时，A - > C
 * 2、当盘的数量 n >= 2 时，都可以看做成两个盘，上面的所有的为一个，最下面的一个为 1 个。
 * 2.1、现将最上面的盘 A -> B
 * 2.2、把最下面的盘 A - > C
 * 2.3、将 B 塔的所有盘从 B -> C
 *
 * @author zjj_admin
 * @date 2022/12/6 21:11
 */
public class HanoiTower {

    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        hanoiTower(8,'A','B','C');
        long end = System.currentTimeMillis();
        System.out.println("用时：" + (end - start) + " ms");
        System.out.println("count = " + count);
//        System.out.println(Long.MAX_VALUE);

    }

    public static long count = 0L;

    public static void hanoiTower(int num, char a, char b, char c) {
        if (num == 1) {
            count ++;
            System.out.println("第 " + count + " 步，第" + num + " 盘从 " + a + " ->" + c);
        } else {
            //现将最上面的所有的盘 从 A -》 B
            hanoiTower(num - 1, a, c, b);
            //将最下面的盘 A->C
            count ++;
            System.out.println("第 " + count + " 步，第" + num + " 盘从 " + a + " ->" + c);
            //将B塔的所有的盘从 B -> C
            hanoiTower(num - 1, b, a, c);
        }
    }


}
